package com.jdbc_.datasource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.jupiter.api.Test;

import java.beans.PropertyVetoException;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

// 演示C3P0的使用
public class C3P0_Demo {

    @Test
    // 方式1：相关参数（如url、user、password、driver），在程序中指定
    public void testC3P0() throws IOException, PropertyVetoException, SQLException {
        // 1、创建数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

        // 2、通过读取配置文件mysql.properties获取相关连接的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\com\\jdbc_\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");

        // 3、给数据源对象comboPooledDataSource 设置相关参数
        /* 注意：数据库的连接管理是交给comboPooledDataSource来管理的 */
        // 3.1 设置基本参数
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);
        // 3.2 初始化连接数---> 连接池创建的时候，里面有多少个连接
        comboPooledDataSource.setInitialPoolSize(10);  // 设置了10个连接
        // 3.3 设置最大连接数---> 连接数可以增加到最多50个，如果还有连接请求，则需等待
        comboPooledDataSource.setMaxPoolSize(50);

        // 4、连接
        Connection connection = comboPooledDataSource.getConnection();
        System.out.println("连接成功");

        // 测试连接池的效率
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection1 = comboPooledDataSource.getConnection();
            System.out.println("连接OK");
            connection1.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("采用连接池连接耗时：" + (end - start) + "毫秒");  // 68毫秒

        // 执行SQL操作

        // 关闭连接  (不是真正关闭连接，只是把连接放回连接池)
        connection.close();
    }

    @Test
    // 方式2：使用配置文件模板来完成连接
    /*
        （1）首先，把c3p0-config.xml拷贝到src文件夹下
        （2）c3p0-config.xml就是c3p0的配置文件，它的名字不能乱写，就是这样子的，
        （3）该文件制定了连接 数据库和连接池的相关参数
     */
    public void testC3P0_2() throws SQLException {
        // 1、创建数据源对象（根据配置文件c3p0-config.xml）
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("lxl_Pool");
        // 2、直接连接即可
        Connection connection = comboPooledDataSource.getConnection();
        System.out.println("连接成功");

        // 测试连接5000次
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection lxl_pool = comboPooledDataSource.getConnection();
            lxl_pool.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("连接耗时：" + (end - start) + "毫秒");  // 33毫秒

        // 3、关闭连接 (不是真正关闭连接，只是把连接放回连接池)
        connection.close();
    }
}
